package algo_annotations.params.param_component;

import algo_annotations.params.ParamsManager_a;
import algo_annotations.params.Params_a;
import algo_annotations.params.objects.ContrainteGeomSegment;
import commons.params.param_component.AbstractParamComponent_table;
import commons.utils.Utils.Side;
import java.util.ArrayList;
import javax.swing.JComponent;


public class ParamComponent_table_ContrainteGeomSegment extends AbstractParamComponent_table {

	public ParamComponent_table_ContrainteGeomSegment(String name, ParamsManager_a paramsManager, JComponent component, boolean bCanBeNull) {
		super(name, paramsManager, component, bCanBeNull,
				new String[] {"Nom catégorie", "Epaissseur segment (mm)", "Epaisseur dissymétrie (mm)", "Côté dissymétrie"},
				new String[] {"nomCategorie", "epaisseur", "epaisseurDissymetrie", "coteDissymetrie"},
				new Class[] {String.class, String.class, String.class, String.class});
	}

	// appelée à la fin par ParamsManager afin de constituer le Params
	// l'argument params permet de retrouver certains objets déjà lus, via leur nom
	//  (les catégories, en l'occurence)
	public ArrayList<ContrainteGeomSegment> getVContrainteGeomSegment(Params_a params) {
		ArrayList<ContrainteGeomSegment> vCGS = new ArrayList<ContrainteGeomSegment>();

		for (int numRow = 0; numRow <data.size() ; numRow++) {
			Object[] rowData = data.get(numRow);

			// La disymétrie est nulle ssi epaisseur disymetrie = 0;
			Side sideDisymetrie;
			String choix = (String) rowData[3];
			if (choix==null || choix.length()==0) {
				assert(Double.parseDouble((String) rowData[2])==0.0); // testé dans l'IHM
				sideDisymetrie = null;
			} else {
				assert(Double.parseDouble((String) rowData[2])!=0.0); // testé dans l'IHM
				sideDisymetrie = Side.valueOf(choix);
			}

			ContrainteGeomSegment cgs = new ContrainteGeomSegment(
								params.getCategorySegmentByName((String) rowData[0]),
								Double.parseDouble((String) rowData[1]),
								Double.parseDouble((String) rowData[2]),
								sideDisymetrie);
			vCGS.add(cgs);
		}
		return vCGS;
	}


	//**************************************************************************
	//**************************************************************************

	@Override
	public void makeStandardControls() {
		assert possibleValues[0] != null;

		// Test si la table peut etre vide
		if (!bCanBeNull && bIsNull) {
			invalidateComponent("Il est obligatoire de déclarer des epaisseurs de segment", true);
			return;
		}

		beginControls();

		// Parcourt des row
		for (int row = 0; row <data.size() ; row++) {

			//***** Nom de la catégorie
			basicCheck_NoDoublon(row, 0);

			//***** Epaisseur des segments
			basicCheck_FloatStrictPos(row, 1);

			//***** Epaisseur dissymétrie
			if (basicCheck_FloatPos(row, 2)) {

				// on ne teste la derniere colonne que s'il y a effectivement une valeur dans l'épaisseur de dissymétrie
				double epaisseurDissymetrie = Double.parseDouble((String) data.get(row)[2]);

				//***** Côté de la dissymétrie
				int col=3;
				String cote = (String) data.get(row)[col];
				if (epaisseurDissymetrie==0.0) {
					// le cote doit etre vide
					if (cote!=null && cote.length()>0)
						addError(row, col, "Ce paramètre doit être vide si l'épaisseur de dissymétrie vaut 0");
				} else {
					// sinon, test standard (non vide et doit faire partie des valeurs possibles
					basicCheck(row, col);
				}
			}

		}
		finaliseControls();
	}

}
